package trastienda.dao;

import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;
import trastienda.excepcion.DAOExcepcion;
import trastienda.modelo.Categoria;


@Repository
public class CategoriaDAOImpl implements CategoriaDAO {

	@PersistenceContext
	private EntityManager em;

	public void setEm(EntityManager em) {
		this.em = em;
	}

	@SuppressWarnings(value = "unchecked")
	public Collection<Categoria> listarTodos() throws DAOExcepcion {
		Collection<Categoria> entities = new ArrayList<Categoria>();
		try {
			Query q = em.createNamedQuery("Categoria.seleccionarTodos");
			entities = q.getResultList();
		} catch (Exception e) {
			throw new DAOExcepcion(e.getMessage());
		}
		return entities;
	}

	@SuppressWarnings("unchecked")
	public Collection<Categoria> buscarPorNombre(String nombre) throws DAOExcepcion {
		Query q = em
				
				.createQuery("select c from Categoria c where upper(c.nombre) like :nombre ");
		q.setParameter("nombre", "%" + nombre.toUpperCase() + "%");
		return q.getResultList();
	}
	
	public void insertar(Categoria vo) throws DAOExcepcion {
		try {
			em.persist(vo);
		} catch (Exception e) {
			e.printStackTrace();
			throw new DAOExcepcion(e.getMessage());
		}
	}

	public Categoria obtenerPorId(int idCategoria) throws DAOExcepcion {
		try {
			return em.find(Categoria.class, idCategoria);
		} catch (Exception e) {
			throw new DAOExcepcion(e.getMessage());
		}
	}

	public Categoria obtenerPorNombre(String nombre) throws DAOExcepcion {
		try {
			return em.find(Categoria.class, nombre);
		} catch (Exception e) {
			throw new DAOExcepcion(e.getMessage());
		}
	}
	
	public void eliminarPorId(int idCategoria) throws DAOExcepcion {
		try {
			Categoria c = em.find(Categoria.class, idCategoria);
			em.remove(c);
		} catch (Exception e) {
			throw new DAOExcepcion(e.getMessage());
		}
	}

	public void eliminarPorNombre(String nombre) throws DAOExcepcion {
		try {
			Categoria c = em.find(Categoria.class, nombre);
			em.remove(c);
		} catch (Exception e) {
			throw new DAOExcepcion(e.getMessage());
		}
	}
	
	public void actualizar(Categoria vo) throws DAOExcepcion {
		try {
			em.merge(vo);
		} catch (Exception e) {
			throw new DAOExcepcion(e.getMessage());
		}
	}
}
